        TTL     > FS01 : The paged ROM header + service call handler

        ORG     &8000

        JMP     Language
        JMP     Service
        =       &C2             ; Type byte (service + language ROM)
        =       :LSB: Copyright ; Offset pointer to copyright message
        =       0               ; Binary version number
        =       "ARFS", 0       ; Title string
        =       "$version" ;,0  ; Version string

Copyright =     0, "(C) 1988 Acorn", 0

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; In    A = service
;       X = ROMid
;       Y = arg

; Out   A = 0 -> claimed

;      The service types are as follows; 
;
;   0  &00   No operation
;   1  &01 x Static space claim at &E00
SV_Static  * 1
;   2  &02 x Dynamic workspace claim, above &E00
SV_Dynamic * 2
;   3  &03 x Auto boot
SV_AutoBoot * 3
;   4  &04 x Unrecognised operating system command
SV_UKCommand * 4
;   5  &05   Unrecognised IRQ
;   6  &06   A 'BRK' instruction has been executed
;   7  &07   Unrecognised 'OSBYTE' call
;   8  &08   Unrecognised 'OSWORD' call
SV_UKWord * 8
;   9  &09 x The 'HELP' interface
SV_Help * 9
;  10  &0A   Claim the use of the Static worksapce at &E00
SV_UseStatic * 10
;  11  &0B   Release NMI
;  12  &0C   Claim NMI
;  13  &0D   Initialise ROM filing system
;  14  &0E   ROM filing system get byte
;  15  &0F   Filing system vectors claimed
SV_Vectors * 15
;  16  &10   SPOOL/EXEC file closure warning
;  17  &11   Font implosion/explosion warning
;  18  &12 x Initialise a filing system
SV_StartUpFS * 18
;  19  &13   Character written to RS423 buffer (ELK)
;  20  &14   Character written to printer buffer (ELK)
;  21  &15   Polling interupt (ELK & PRB)
;  22  &16   Offer the bell to external sound (ELK)
;  23  &17   Purge external sound buffers (ELK)
;  24  &18   Do interactive help (PRB)
; 
;  33  &21   Static space claim at &C000 (PRB)
;  34  &22   Dynamic workspace claim, above &C000 (PRB)
;  35  &23   Inform top of &C000 Static space (PRB)
;  36  &24   Dynamic space test (PRB)
;  37  &25   Return filing system name, handles, and number (PRB)
;  38  &26   Shut all files (PRB)
;  39  &27   Initialsation call occurs after all space calls (PRB)
;  40  &28   Unknown *CONFIGURE (PRB)
;  41  &29   Unknown *STATUS (PRB)
;  42  &2A   ROM based language starting up (PRB)
;  43  &2B   Display startup banner (B+ & PRB)
; 
; 254  &FE   Tube post initialisation
; 255  &FF   Tube main initialisation

stack   *       &0101

Service ROUT

        PHA                     ; stack+1
 [ $debugservice
 JSR debugA
 ]
        PHY                     ; stack+0
        CMPIM   SV_Static       ; What service is this ?
        BEQ     StaticClaim
        CMPIM   SV_Dynamic
        BEQ     DynamicClaim
        CMPIM   SV_AutoBoot
        BEQ     jAutoBoot
        CMPIM   SV_UKCommand
        BEQ     jUKCommand
        CMPIM   SV_UKWord
        BEQ     jUKWord
        CMPIM   SV_Help
        BEQ     DoHelp
        CMPIM   SV_StartUpFS
        BEQ     jStartUpFS

; ............................................................................
; Routines must JMP to here after processing service call

EndService
        PLY
EndS_AX
        PLA
EndS_X  LDX     ROMid
        RTS

ClaimService
        PLY
        PLA
        LDAIM   0
        BEQ     EndS_X ; BRA

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; In    Y = current high water mark of static workspace

StaticClaim ROUT

 [ $debugservice
 LDAIM "Y"
 JSR oswrch
 TYA
 JSR debugA
 ]
        CPYIM   AbsPages + (:MSB: &0E00)
        BCS     EndService

        LDYIM   AbsPages + (:MSB: &0E00) ; Bump up HWM
        PLA                     ; Skip stacked Y
        BRA     EndS_AX

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; In    Y = current dynamic workspace level

DynamicClaim ROUT

 [ $debugservice
 LDAIM "Y"
 JSR oswrch
 TYA
 JSR debugA
 ]
        TYA
        LDX     ROMid           ; Remember our private ws^
        STAAX   RPrivTable

        PHA                     ; Remember base for later
        Push    pwptr

        CLR     pwptr
        STY     pwptr+1

; This will be copied into the static ws when we are fired up

        LDAIM   "0"
        LDYIM   d_dfsdrive
        STAIY   pwptr
        LDYIM   d_dfsldrive
        STAIY   pwptr

        LDAIM   "$"
        LDYIM   d_dfsdir
        STAIY   pwptr
        LDYIM   d_dfslib
        STAIY   pwptr

        Pull    pwptr
        PLA

        CLC
        ADCIM   DynPages        ; Claim some ws
        TAY
        PLA                     ; Skip stacked Y
        BRA     EndS_AX

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

jAutoBoot
        JMP     AutoBoot

jUKCommand
        JMP     UKCommand

jUKWord
        JMP     UKWord

jStartUpFS
        JMP     StartUpFS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; In    os_cliptr, Y -> string to do help on

DoHelp ROUT

        Push    vstrptr         ; Save zp

        LDAIY   os_cliptr
        CMPIM   " "
        BCC     #FT90           ; [empty]

        JSR     gchelp
        BEQ     #FT05
        CMPIM   "a"
        BNE     #FA99
        JSR     gchelp
        BEQ     #FT05
        CMPIM   "r"
        BNE     #FA99
        JSR     gchelp
        BEQ     #FT05
        CMPIM   "f"
        BNE     #FA99
        JSR     gchelp
        BEQ     #FT05
        CMPIM   "s"
        BNE     #FA99
        LDAIY   os_cliptr
        CMPIM   " "+1
        BCC     #FT05
        BCS     #FA99 ; BRA

; *Help with no arg

90      JSR     MainHelp

        JSR     vstring
        =       "  ARFS", CR
        NOP

99      Pull    vstrptr
        JMP     EndService


; *Help on 'ARFS' or '.'

05      JSR     MainHelp

        LDXIM   0
10      LDAAX   comtable 
        BEQ     #BA99           ; [ended table]
        LDY     currfs          ; <<< WRONG, but hard to avoid at present
        LDAAY   CallerBits      ; Give help on util commands and curr fs cmds
        ORAIM   ut_cmd
        ANDAX   comtable
        BEQ     #FT80           ; [no info please]


20      JSR     Do2Spaces       ; Skip first id byte

fwidth  *       10

        LDAIM   fwidth
        STA     vstrptr

25      INX                     ; Print command text
        LDAAX   comtable
        BMI     #FT30           ; [ended word]
        JSR     oswrch
        DEC     vstrptr
        BRA     #BT25

30      ANDIM   &7F             ; Syntax msg ?
        ASLA                    ; *2
        PHX
        TAX
        LDYAX   syntable        ; MSB
        BEQ     #FT50           ; [null syntax msg]

40      JSR     DoSpace
        DEC     vstrptr
        BNE     #BT40

        LDAAX   syntable+1      ; LSB
        TAX
        JSR     xystring

50      PLX
        JSR     osnewl

60      INX                     ; Skip
        BRA     #BT10           ; Do next entry

80      INX
        LDAAX   comtable
        BMI     #BT60           ; [ended word]
        BPL     #BT80 ; BRA


MainHelp
        JSR     vstring
        =       CR, "Acorn ARFS $version", CR
        NOP
        RTS


gchelp  LDAIY   os_cliptr
        INY
        ORAIM   &20
        CMPIM   "."
        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; In    Unknown OSWord A,X,Y in &EF,&F0,&F1

UKWord ROUT

        LDA     osw_A           ; Which OSWord was it?
 [ $debugservice
 PHA
 LDAIM "A"
 JSR oswrch
 PLA
 JSR debugA
 ]

        CMPIM   &70             ; ADFS ?
        BCC     #FT90
        CMPIM   &72+1
        BCC     #FT50

        CMPIM   &7C             ; DFS ?
        BCC     #FT90
        CMPIM   &7F+1
        BCC     #FT50

90      RTS

50 ; Filing system OSWord

        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Acknowledge ESCAPE, preserving Y

AckEscape
        PHY
        LDAIM   &7E
        JSR     osbyte
        PLY
        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

        LNK     FS10
